package com.david.course_design.shopping_center.module.shoppingCart.service;

import com.david.course_design.shopping_center.module.shoppingCart.entity.ShoppingCart;
import com.david.course_design.shopping_center.module.shoppingCart.entity.VO.ShoppingCartItemVo;
import com.david.course_design.shopping_center.module.shoppingCart.entity.VO.ShoppingCartVo;
import com.david.course_design.shopping_center.result.PageObject;
import com.github.pagehelper.PageInfo;


public interface ShoppingCartService {
    /**
     * 查询当前用户的所有购物车记录（分页）
     *
     * @param userId     当前用户的主键（userId）
     * @param pageObject 分页对象（包含pageNum(当前第几页)和pageSize(每页数据的条数)）
     * @return
     */
    PageInfo<ShoppingCart> CurrentUserSelectAllShoppingCartItemByPaging(Integer userId, PageObject pageObject);

    /**
     * 添加商品到当前用户的购物车中
     *
     * @param userId         当前用户的主键（userId）
     * @param shoppingCartVo 需要添加到用户购物车的商品的对象（shoppingCartVo）
     * @return 返回数据库受影响的行数
     */
    Integer addGoodsItemToCurrentUserShoppingCartByGoodsId(Integer userId, ShoppingCartVo shoppingCartVo);

    /**
     * 通过商品主键删除当前用户购物车中的商品
     *
     * @param userId  当前用户的主键（userId）
     * @param goodsId 当前需要从购物车中删除的商品的主键（goodsId）
     * @return 返回数据库受影响的行数
     */
    Integer deleteGoodsItemFromCurrentUserShoppingCartByGoodsId(Integer userId, Integer goodsId);

    /**
     * 通过商品主键（goodsId）查询当前商品是否已经添加到当前用户的购物车中
     *
     * @param userId  当前用户的主键（userId）
     * @param goodsId 当前的商品的主键（goodsId）
     * @return 返回一个布尔值 ==> true:当前商品已经被添加到了当前用户的购物车中; false: 表示当前商品还未添加到当前用户的购物车
     */
    boolean selectCurrentGoodsIsInShoppingCartByGoodsId(Integer userId, Integer goodsId);

    /**
     * 通过用户主键id和商品主键查询购物车中商品的信息
     *
     * @param userId  用户主键 （userId）
     * @param goodsId 商品主键 （goodsId）
     * @return 返回查询到的数据库记录（数据库中商品条目并非商品的具体信息，如果需要查询商品的具体信息还需要通过商品的主键（goodsId）查询商品信息表获取商品信息）
     */
    ShoppingCart selectShoppingCartItemByUserIdAndGoodsId(Integer userId, Integer goodsId);

    /**
     * 通过用户主键 id 和商品主键 id 修改购物车中记录中的 商品的数量
     *
     * @param userId      用户主键 id
     * @param goodsId     商品主键 id
     * @param goodsNumber 商品数量
     * @return 返回数据库中受影响的行数
     */
    Integer updateShoppingCartItemGoodsNumberByUserIdAndGoodsId(Integer userId, Integer goodsId, Integer goodsNumber);

    /**
     * 查询当前用户的购物车中的商品条目和商品的信息
     *
     * @param userId     当前用户的主键（userId）
     * @param pageObject 分页对象（包含pageNum(当前第几页)和pageSize(每页数据的条数)）
     * @return 返回当前用户购物车中的所有商品和商品的详细信息
     */
    PageInfo<ShoppingCartItemVo> selectShoppingCartItemByPaging(Integer userId, PageObject pageObject);
}
